﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SIGCBI.Entities;
using SIGCBI.Repository;
using Microsoft.Practices.Unity;

namespace SIGCBI.BusinessLogic
{
    public interface IPecosaBL
    {
        List<PECOSA> GetAllFromPecosa();
        List<PECOSA> GetFromPecosaByCriterioAndAreaAndFecha(string solicitante, string nroDoc, string area, DateTime? fec1, DateTime? fec2);

        PECOSA GetFromPecosaById(Int32 id);

        void AddPecosa(PECOSA pecosa);
        void UpdatePecosa(PECOSA pecosa);
    }

    public class PecosaBL : IPecosaBL
    {
        [Dependency]
        public IProductoRepository productoRepository { get; set; }
        
        [Dependency]
        public IUnidadMedidaRepository undMedidaRepository { get; set; }

        [Dependency]
        public IPecosaRepository pecosaRepository { get; set; }

        [Dependency]
        public IDetallePecosaRepository detallePecosaRepository { get; set; }

        public List<PECOSA> GetAllFromPecosa()
        {
            return pecosaRepository.GetAllFromPecosa();
        }

        public List<PECOSA> GetFromPecosaByCriterioAndAreaAndFecha(string solicitante, string nroDoc, string area, DateTime? fec1, DateTime? fec2)
        {
            return pecosaRepository.GetFromPecosaByCriterioAndAreaAndFecha(solicitante, nroDoc, area, fec1, fec2);
        }

        public PECOSA GetFromPecosaById(int id)
        {
            return pecosaRepository.GetFromPecosaById(id);
        }

        public void AddPecosa(PECOSA pecosa)
        {
            var msg = "";
            var ok = pecosa.Validate(out msg);

            if (ok)
            {
                ValidarStocks(pecosa);

                pecosaRepository.AddPecosa(pecosa);

                //#region UpdateStock
                //foreach (var item in pecosa.DETALLE_PECOSA)
                //{
                //    var producto = productoRepository.GetFromProductoById(item.IdProducto);
                //    var foto = new FOTO_PRODUCTO(); //= fotoTrabajadorRepository.GetFotoTrabajadorByIdTrabajador(pecosa.IdSolicitante);
                //    var undMedida = undMedidaRepository.GetFromUnidadMedidaById(producto.IdUnidadMedida);

                //    var actproducto = producto;
                //    actproducto.FOTO_PRODUCTO = foto;
                //    actproducto.UNIDAD_MEDIDA = undMedida;

                //    actproducto.Stock = producto.Stock - item.Cantidad;
                //    productoRepository.UpdateProducto(actproducto);
                //}
                //#endregion

            }
            else
            {
                throw new Exception(msg);
            } 
        }

        public void UpdatePecosa(PECOSA pecosa)
        {
            var msg = "";
            var ok = pecosa.Validate(out msg);

            if (ok)
            {
                ValidarStockEditar(pecosa);

                //#region UpdateStock
                //foreach (var item in pecosa.DETALLE_PECOSA)
                //{
                //    var existeDetal = detallePecosaRepository.GetFromDetallePecosaByProductoIdAndPecosaId(item.IdProducto, pecosa.ID);

                //    if (existeDetal != null)//modificado
                //    {
                //        if (item.Cantidad != existeDetal.Cantidad)
                //        {
                //            var producto = productoRepository.GetFromProductoById(item.IdProducto);
                //            var foto = new FOTO_PRODUCTO(); //= fotoTrabajadorRepository.GetFotoTrabajadorByIdTrabajador(pecosa.IdSolicitante);
                //            var undMedida = undMedidaRepository.GetFromUnidadMedidaById(producto.IdUnidadMedida);

                //            var actproducto = producto;
                //            actproducto.FOTO_PRODUCTO = foto;
                //            actproducto.UNIDAD_MEDIDA = undMedida;

                //            actproducto.Stock = producto.Stock + existeDetal.Cantidad - item.Cantidad;
                //            productoRepository.UpdateProducto(actproducto);
                //        }
                //    }
                //    else//nuevo
                //    {
                //        var producto = productoRepository.GetFromProductoById(item.IdProducto);
                //        var foto = new FOTO_PRODUCTO(); //= fotoTrabajadorRepository.GetFotoTrabajadorByIdTrabajador(pecosa.IdSolicitante);
                //        var undMedida = undMedidaRepository.GetFromUnidadMedidaById(producto.IdUnidadMedida);

                //        var actproducto = producto;
                //        actproducto.FOTO_PRODUCTO = foto;
                //        actproducto.UNIDAD_MEDIDA = undMedida;

                //        actproducto.Stock = producto.Stock - item.Cantidad;
                //        productoRepository.UpdateProducto(actproducto);
                //    }
                //}
                //#endregion

                pecosaRepository.UpdatePecosa(pecosa);
            }
            else
            {
                throw new Exception(msg);
            } 
        }

        private void ValidarStocks(PECOSA pecosa)
        {
            foreach (var item in pecosa.DETALLE_PECOSA)
            {
                var producto = productoRepository.GetFromProductoById(item.IdProducto);

                var cantActualDetalle = detallePecosaRepository.GetFromDetallePecosaByProductoIdAndPecosaId(item.IdProducto, pecosa.ID);

                if (cantActualDetalle == null)
                {
                    if (item.Cantidad > producto.Stock)
                    {
                        throw new Exception(string.Format("No hay Stock suficiente para el producto {0}," +
                                          " solo quedan {1} Und.", producto.Nombre, producto.Stock));
                    }
                }
                if (cantActualDetalle != null)
                {
                    var stockActual = producto.Stock + cantActualDetalle.Cantidad;
                    if (item.Cantidad > stockActual)
                    {
                        throw new Exception(string.Format("La maxima cantidad a elegir del producto {0}," +
                                          " es {1} Und.", producto.Nombre, stockActual));
                    }
                }
            }
        }

        private void ValidarStockEditar(PECOSA pecosa)
        {
            foreach (var item in pecosa.DETALLE_PECOSA)
            {
                var producto = productoRepository.GetFromProductoById(item.IdProducto);

                var cantActualDetalle = detallePecosaRepository.GetFromDetallePecosaByProductoIdAndPecosaId(item.IdProducto, pecosa.ID);

                if (cantActualDetalle == null)
                {
                    if (item.Cantidad > producto.Stock)
                    {
                        throw new Exception(string.Format("No hay Stock suficiente para el producto {0}," +
                                          " solo quedan {1} Und.", producto.Nombre, producto.Stock));
                    }
                }
                if (cantActualDetalle != null)
                {
                    var stockActual = producto.Stock + cantActualDetalle.Cantidad;
                    if (item.Cantidad > stockActual)
                    {
                        throw new Exception(string.Format("La maxima cantidad a elegir del producto {0}," +
                                          " es {1} Und.", producto.Nombre, stockActual));
                    }
                }
            }
        }


    }
}


